home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM-A.ZIP / AG.ASM < prev    next >
Assembly Source File  |  1995-10-29  |  6KB  |  367 lines

  1. .286c
  2. .model small
  3. .code
  4.         org     100h
  5. start:
  6.  
  7. jmp    install
  8.  
  9. old_si  dw      0
  10. old_bx     dw    0
  11. old_cx    dw    0
  12. old_dx    dw    0
  13. es_main    dw    0
  14. num_ff    dw    0
  15. last_pag dw    0
  16. viroff    dw    0
  17. count    db    0
  18. scan_seg dw     0
  19. mes db 'Found !','$'
  20. filnm   db      15 dup(0)
  21. buffer  db      'NCMAIN.EXE',0h,0h,0h,0h,0h
  22.     db    'QA.COM',
  23.         db      64 dup (0)
  24.  
  25. include datagame.inc
  26.  
  27.  
  28. int_21h_entry:
  29.  
  30.         pushf                    ; Push flags
  31.     sti                    ; Enable interrupts
  32.     cmp    ah,4Bh                ;
  33.         jne     loc_24                          ; Jump if equal
  34.     cmp    al,0
  35.         je      loc_25
  36.  
  37. loc_24:
  38.     popf                    ; Pop flags
  39.     db    0EAh
  40. old_21h_off  dw     ?
  41. old_21h_seg  dw  ?
  42.  
  43.  
  44. loc_25:
  45.     mov    cs:old_bx,bx
  46.     push    ax
  47.     push    cx
  48.     push    di
  49.     push    es
  50.         push    ds
  51.         push    si
  52.     push    dx
  53.  
  54.         mov     si,dx
  55. loc_205:
  56.     inc    si
  57.     cmp byte ptr ds:[si],0
  58.     jne    loc_205
  59.     mov    bh,0
  60. loc_206:
  61.     inc    bh
  62.     dec    si
  63.     cmp byte ptr ds:[si],'\'
  64.     jne    loc_206
  65.     inc    si
  66.     dec    bh
  67.     push    cs
  68.     pop    es
  69.     xor    cx,cx
  70.     mov    bl,-1
  71. loc_94:
  72.         inc     bl
  73.         lea     di,cs:buffer
  74.         mov     ax,15
  75.         mul     bl
  76.         add     di,ax
  77.         push    si
  78.         mov     cl,bh
  79.         rep     cmpsb
  80.         pop     si
  81.         je      loc_57
  82.         cmp     bl,4
  83.         jne     loc_94
  84.         jmp short loc_95
  85.  
  86. loc_57:
  87.         mov     byte ptr cs:count,0
  88.         jmp     loc_fin
  89.  
  90. loc_95:
  91.     mov    cl,bh
  92.         lea     di,cs:filnm
  93.         repne movsb
  94.         sub     si,3
  95.         cmp word ptr ds:[si],'XE'
  96.     jne    loc_47
  97.     lea    ax,cs:only_exe
  98.     mov  byte ptr bl,cs:only_exe_count
  99.         jmp short loc_files
  100.  
  101. loc_47:
  102.         cmp  word ptr ds:[si],'OC'
  103.     je     loc_79
  104.     lea    ax,cs:ov_pi
  105.     mov    byte ptr bl,cs:ov_pi_count
  106.         jmp short loc_files
  107.  
  108. loc_79:
  109.     lea    ax,cs:com_exe
  110.     mov  byte ptr bl,cs:com_exe_count
  111.  
  112. loc_files:
  113.  
  114.     mov    cs:viroff,ax
  115.         mov     byte ptr cs:count,bl
  116.  
  117.         mov     ah,3dh
  118.     xor    al,al
  119.     int     21h      ; file is open for reading
  120.     jc    loc_fin
  121.  
  122.         mov     bx,ax
  123.     mov    ah,42h
  124.     xor    cx,cx
  125.     mov    dx,cx
  126.     mov    al,2
  127.     int    21h    ; seek to the end
  128.  
  129.            mov    cs:num_ff,dx      ; save number of 64k
  130.     mov    cs:last_pag,ax    ; save length of last page
  131.  
  132.     mov    ah,3eh
  133.     int    21h     ; close the file
  134.  
  135. loc_fin:
  136.     pop    dx
  137.         pop     si
  138.         pop     ds
  139.     pop    es
  140.     pop    di
  141.     pop    cx
  142.     pop    ax
  143. loc_en:
  144.     mov    bx,cs:old_bx
  145.     jmp    loc_24
  146.  
  147. message:
  148.         mov     dx,si
  149.         mov     ah,09h
  150.         int    21h
  151.         lea     dx,mes
  152.         mov     ah,09h
  153.         int    21h
  154.     ret
  155.  
  156. int_4b_scan:
  157.  
  158.         mov     old_bx,bx
  159.     mov    old_dx,dx
  160.     push    cs
  161.     pop    ds
  162.     add     dx,10h            ; dx = Start seg
  163.  
  164.     call    scanvir
  165.     jc    loc_vir
  166.  
  167.         mov     ax,old_bx
  168.     mov    dx,old_dx
  169.         mov     ds,dx
  170.         mov     es,dx
  171.     retf
  172.  
  173. loc_vir:
  174. ;    call    message
  175.         pop     dx
  176.         pop     ds
  177.     mov    dx,old_dx
  178.         push    dx
  179.         xor     dx,dx
  180.         push    dx
  181.         retf
  182.  
  183.  
  184. scanvir:
  185.     ; dx = segment for scan     (offset = 0)
  186.     ; cs:viroff = offset of virtable
  187.     ; ds = segment of virtable
  188.     ; cs:count = number of viruses
  189.     ; cs:num_ff = number of 64k
  190.     ; cs:last_pag = number of bytes in last page
  191.     ; return bit c if virus is founded
  192.     ; ds:si points to the viruses name
  193.     ; bp,es,di,bx,ax,dx ¼πß«α
  194.  
  195.         mov     cs:es_main,dx     ; es_main = Start_seg
  196.  
  197.     mov    bp,cs:viroff      ; bp - pointer to virus table
  198.     mov     bh,0
  199.  
  200. loc_5:
  201.     cmp     byte ptr cs:count,bh
  202.     jne    loc_61
  203.     ret
  204. loc_61:
  205.     inc    bh
  206.     mov    di,cs:es_main     ;
  207.     mov    es,di             ;
  208.     xor     di,di             ;
  209.     mov    dx,cs:num_ff      ;
  210.     mov    si,cs:[bp]        ; si points to this viruses pattern
  211.     lodsb
  212.     mov    bl,al             ; bl - counter of characters in virus pattern
  213.     sub    bl,1
  214.     lodsb                ; al - first char of pattern
  215.     jmp    loc_12            ; go to search
  216.  
  217. loc_9:
  218.     cmp    dx,-1             ; virus is ended ?
  219.     jne    loc_15            ; no
  220.     add    bp,2              ; bp points to the next virus
  221.         jmp    loc_5
  222.  
  223. loc_15:
  224.  
  225.     xor    di,di          ; di points to the beginning of the next segment
  226.     mov     cx,es             ;
  227.     add    cx,1000h          ;
  228.     mov    es,cx             ; es points to the next segment
  229.  
  230. loc_12:
  231.     cmp    dx,0              ; we'll work with last page ?
  232.     je    loc_2             ; yes
  233.     mov    cx,0ffffh         ; cx = maximum counter
  234.     jmp    loc_10
  235. loc_2:
  236.     mov     cx,cs:last_pag    ;
  237.  
  238. loc_10:
  239.  
  240.     repne    scasb             ; search for first char
  241.     je    loc_13            ; found
  242.     dec    dx                ; decrement of the counter of 64k
  243.     jmp    loc_9             ; go to the preparing for the search in next segment
  244.  
  245. loc_13:
  246.     mov    cs:old_cx,cx      ;
  247.     mov    cs:old_si,si
  248.     push    di
  249.     push    es
  250.     cmp    di,0fff0h
  251.     jbe    loc_7
  252.     mov    cx,es
  253.     inc    cx
  254.     mov    es,cx
  255.     sub    di,10h
  256.  
  257. loc_7:
  258.     xor    cx,cx
  259.     mov    cl,bl
  260.     repz    cmpsb
  261.     jne    loc_11
  262.     pop    es
  263.     pop    di
  264.     jmp    loc_89  ; found !
  265.  
  266. loc_11:
  267.     mov    si,cs:old_si
  268.     pop    es
  269.     pop    di
  270.     mov    cx,cs:old_cx
  271.     jmp    loc_10
  272.  
  273. loc_er:
  274.  
  275.  
  276. loc_89:
  277.     stc
  278.     ret
  279.  
  280.  
  281. pattern:
  282.     db    08eh
  283.     db    0c2h
  284.     db    08eh
  285.     db    0dah
  286.     db    08bh
  287.     db    0c3h
  288.     db    0cbh
  289.  
  290.  
  291. install:
  292.     int    5
  293.  
  294.     cli        ; set new stack
  295.     mov    ax,cs
  296.     mov    ss,ax
  297.     mov    bx,offset n
  298.     add    bx,50h
  299.     mov    sp,bx
  300.     sti
  301.  
  302.         xor     ax,ax
  303.         push    ax
  304.         pop     ds ; ds=0
  305.     cli
  306.  
  307.         mov     di,ds:[21h*4]
  308.         mov     ax,ds:[21h*4+2]
  309.         mov     cs:old_21h_off,di
  310.         mov     cs:old_21h_seg,ax
  311.  
  312.         mov     di,ds:[31h*4]
  313.         mov     ax,ds:[31h*4+2]
  314.     push    ax
  315.     pop    es
  316.  
  317.  
  318.         mov     ds:[21h*4],offset int_21h_entry
  319.         mov     ds:[21h*4+2],cs
  320.  
  321.     sti
  322.  
  323.                                  ; find 'MZ'
  324.     mov    cx,-1
  325.     cld
  326.     mov    byte ptr al,4dh
  327. loc_lo:
  328.     repne    scasb
  329.     jne    loc_err
  330.     cmp    byte ptr es:[di],5ah
  331.     jne    loc_lo
  332.  
  333. loc_loop:
  334.                                  ; 'MZ' found
  335.  
  336.     push    cs
  337.     pop    ds
  338.     lea     si,cs:pattern
  339.     inc    si
  340.  
  341.  
  342.     mov    byte ptr al,cs:[si-1]
  343.     inc    si
  344. loc_loop1:
  345.     dec    si
  346.     repne    scasb
  347.     jne    loc_err
  348.     push    cx
  349.     mov    cx,6
  350.     rep    cmpsb
  351.     pop    cx
  352.     jnz    loc_loop1
  353.  
  354. suc_end:
  355.  
  356.     mov    byte ptr es:[di-5],0eah
  357.     mov    es:[di-4],offset int_4b_scan
  358.     mov    es:[di-2],cs
  359.  
  360. loc_err:
  361.  
  362.     mov    dx,offset install
  363.     int    27h
  364.  
  365. n:
  366.     dw    50 dup (0)
  367.     end     start